package com.note.feng.leetcode.algorithms.easy.six;

import java.util.Arrays;

public class SixHundredFortyFive {
    /**
     * 645 错误的集合
     * 集合 s 包含从 1 到 n 的整数。不幸的是，因为数据错误，导致集合里面某一个数字复制了成了集合里面的另外一个数字的值，
     * 导致集合 丢失了一个数字 并且 有一个数字重复 。
     *
     * 给定一个数组 nums 代表了集合 S 发生错误后的结果。
     *
     * 请你找出重复出现的整数，再找到丢失的整数，将它们以数组的形式返回。
     *
     * 示例 1：
     *
     * 输入：nums = [1,2,2,4]
     * 输出：[2,3]
     * 示例 2：
     *
     * 输入：nums = [1,1]
     * 输出：[1,2]
     *  
     * 提示：
     *
     * 2 <= nums.length <= 104
     * 1 <= nums[i] <= 104
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode.cn/problems/set-mismatch
     */
    /**
     * 解法：排序
     * 将数组排序后，若相邻的两个数相等，则这个数就是重复的数字；
     * 丢失的数字，有以下几种情况：
     * 1、前一个数与后一个数不不相等，并且差不是1，前一个数字 + 1，就是丢失的数字；
     * 2、如果丢失的数字是 1 或者 n , 需要单独判断，例如：[2,2],[1,2,2,3]
     * @param nums
     * @return
     */
    public int[] findErrorNums(int[] nums) {
        Arrays.sort(nums);
        int [] res = new int[2];
        for (int i = 1; i < nums.length; i++) {
            if(nums[i] == nums[i - 1]){
                res[0] = nums[i];
            }else if(nums[i - 1] + 1 != nums[i]){
                res[1] = nums[ i - 1] + 1;
            }
        }
        if(res[1] == 0){
            if(nums[nums.length - 1] != nums.length){
                res[1] = nums.length;
            }else {
                res[1] = 1;
            }
        }
        return res;
    }
}
